package cliente.auxiliar;

import cliente.ClienteRMI;
import common.*;
import cliente.GereOperacoes;
import cliente.rmi_aux.RMInterface;
import java.io.IOException;
import java.util.ArrayList;


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author A8
 */
public class Envia extends Thread {

    Conexao ligacao;
    private ArrayList<Menssagem> buffer = null;
    GereOperacoes gestor = null;

    public Envia(Conexao ligacao, GereOperacoes gestor) {
        this.ligacao = ligacao;
        buffer = new ArrayList<Menssagem>();
        this.gestor = gestor;
    }

    //Alterado para a meta 4
    public GereOperacoes getGestor() {
        return gestor;
    }

    public void setLigacao(Conexao ligacao) {
        this.ligacao = ligacao;
    }

    public ArrayList<Menssagem> getArraySMS() {
        return buffer;
    }

    public void setBuffer(ArrayList<Menssagem> buffer) {
        this.buffer = buffer;
    }

    synchronized public void setArrayList(Menssagem obj) {
        if (this.buffer.add(obj)) {
            this.notify();
            System.out.println("[INFO]Objecto adicionado!");
        }
    }

    synchronized public void acorda() {
        this.notify();
    }

    public void run() {


        while (true) {

            if (gestor.getConexao().getEstado().equalsIgnoreCase("Off")) {
                return;
            }
            try {
                if (!buffer.isEmpty()) {
                    for (int i = 0; i < buffer.size(); i++) {
                        Menssagem noBuffer = buffer.get(i);
                        if (noBuffer.getMenssagem().contains("Ver mensagens")) {
                            if (!gestor.getMensagem().equals("")) {
                                System.out.println("A ler do buffer!!!");
                                RespOut resp = new RespOut("[Server]", gestor.getMensagem(), gestor.getNome());
                                gestor.trataMensagem(resp);
                                gestor.setMensagem("");
                                buffer.remove(i);
                            } else {
                                if (gestor.getConexao().getPort() == ClienteRMI.mainPort) {
                                    //Vamos chamar metudos RMI
                                    System.out.println("Na porta 8000 e com coisas para enviar");
                                    if (gestor.getConexao().getEstado().equals("Ligado")) {
                                        gestor.getInter().trocaDados(noBuffer);
                                    }
                                } else {
                                    opcoes(noBuffer);
                                }
                                buffer.remove(i);
                            }
                        } else {
                            if (gestor.getConexao().getPort() == ClienteRMI.mainPort) {
                                //Vamos chamar metudos RMI
                                System.out.println("Na porta 8000 e com coisas para enviar");
                                if (gestor.getConexao().getEstado().equals("Ligado")) {
//                                    RMInterface tem_int = new RMInterface(gestor);
                                    RMInterface tem_int=gestor.getInter();
                                    System.out.println("Buffer:"+noBuffer.getEmissor()+"-"+noBuffer.getMenssagem()); 
                                    tem_int.trocaDados(noBuffer);
                                }
                            } else {
                                opcoes(noBuffer);
                            }
                            buffer.remove(i);
                        }
                    }
                } else {
                    synchronized (this) {
                        try {
                            this.wait(30000);
                        } catch (InterruptedException ex) {
                            System.out.println("[Erro]:" + ex.getMessage());
                        }
                    }
                }
            } catch (IOException ex) {
                synchronized (this) {
                    try {
                        this.wait(30000);
                    } catch (InterruptedException ex2) {
                        System.out.println("[Erro]:" + ex2.getMessage());
                    }
                }
            }
        }
    }

    public void opcoes(Menssagem sms) throws IOException {

        System.out.println("Mensagem:" + sms.getMenssagem());
        ligacao.sendMensagemTCP(sms);
        System.out.println("Mensagem da thread cliente enviada");

    }
}
